﻿// See https://aka.ms/new-console-template for more information
//选择排序，开启一个循环，每轮从未排序区间选择最小的元素，将其放到已排序区间的末尾。
//设数组的长度为n，选择排序的算法流程如下：
//初始状态下，所有元素未排序，即未排序（索引）区间为[0,n-1]。
//选取区间[0,n-1]中的最小元素，将其与索引0处元素交换。完成后，数组前1个元素已排序。
//选取区间[1,0-1]中的最小元素，将其与索引1处元素交换。完成后，数组前2个元素已排序。
//以此类推。经过n-1轮选择交换后，数组前n-1个元素已经排序。
//仅剩的一个元素必定是最大元素，无需排序，因此数组排序完成。
int[] arry = new int[10] { 12, 3, 3, 3, 3, 3, 3, 3, 3, 3 };
for (int i = 0; i < arry.Length; i++)
{
    arry[i] = new Random().Next(1, 101);//前开后闭
    Console.WriteLine(arry[i]);
}
Console.WriteLine("以上为排序前");
//选择排序
int n = arry.Length;
//外循环，未排序区间为[i,n-1]
for (int i = 0; i < n - 1; i++)
{
    //内循环，找到未排序区间内的最小元素
    int k = i;
    for (int j = i + 1; j < n; j++)
    {
        if (arry[j] < arry[k])
            k = j;//记录最小元素的索引
    }
    //元素交换
    //采用元组形式交换，实际编译后还是产生了中间变量
    (arry[k], arry[i]) = (arry[i], arry[k]);
}

for (int i = 0; i < arry.Length; i++)
{
    Console.WriteLine(arry[i]);
}
Console.WriteLine("以上为排序后");